import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class MyDirectory {
	MyDirectory() {
	}

	public File getDirectory() {
		MyDirectory test = new MyDirectory();
		Class<? extends MyDirectory> testClass = test.getClass();
		// リソースとして自分自身を探す。これなら、間違いなくあるはず。
		URL url = testClass.getResource("MyDirectory.class");
//		OSName osname = getOsName();
		

		
		File dir = null;

		String protocol = url.getProtocol();
		String psname = url.toString();
//		if(osname==OSName.MAC_OSX){
//			try {
//				byte[] tmp = psname.getBytes("UTF-8");
//				psname = new String(tmp);
//			} catch (UnsupportedEncodingException e) {
//				System.exit(1);
//			}
//		}
		
		
		// Jar化されている場合は、
		if (protocol.equals("jar")) {

			// URLの要らない部分を取って、
			Pattern p = Pattern.compile("(file:/.*)!/");
			//Matcher m = p.matcher(url.toString());
			Matcher m = p.matcher(psname);
			if (!m.find()) {
				System.out.println("find失敗");
				System.exit(1);
			}

			// Jarファイルの場所を特定し、
			File jarFile = null;
			try {
				jarFile = new File(new URI(m.group(1)));
			} catch (URISyntaxException ex) {
				ex.printStackTrace();
				System.exit(1);
			}

			// その親ディレクトリ。
			dir = jarFile.getParentFile();
		}

		// Jar化されていない場合は、
		else if (protocol.equals("file")) {

			// クラスファイルの場所を特定し、
			File classFile = null;
			try {
//				classFile = new File(new URI(url.toString()));
				classFile = new File(new URI(psname));
			} catch (URISyntaxException ex) {
				ex.printStackTrace();
				System.exit(1);
			}

			Package pack = testClass.getPackage();

			// 無名パッケージの場合は、
			if (pack == null) {

				// その親ディレクトリ。
				dir = classFile.getParentFile();
			}

			// パッケージ名がある場合は、
			else {

				// パッケージの階層の分だけ上に上がる。
				String packName = pack.getName();
				String[] words = packName.split("\\.");
				dir = classFile.getParentFile();
				for (int i = 0; i < words.length; i++) {
					dir = dir.getParentFile();
				}
			}
		}
		return dir;
	}


	/**OSの種別*/
	public enum OSName {
	    /**AIX*/
	    AIX,
	    /**HP_UX*/
	    HP_UX,
	    /**IRIX*/
	    IRIX,
	    /**LINUX*/
	    LINUX,
	    /**MAC*/
	    MAC,
	    /**MAC_OSX*/
	    MAC_OSX,
	    /**OS2*/
	    OS2,
	    /**SOLARIS*/
	    SOLARIS,
	    /**SUN_OS*/
	    SUN_OS,
	    /**WINDOWS*/
	    WINDOWS,
	    /**不明*/
	    UNKNOWN
	}


	/**
	 * OS名を取得する。<
	 * @return OS名
	 */
	public static final OSName getOsName() {
		String os;
		try{
			os = System.getProperty("os.name");
			if(os!=null){
				os = os.toLowerCase();
				if (os.contains("mac") ) {
			        return OSName.MAC_OSX;
				}
				else if(os.contains("windows")){
					return OSName.WINDOWS;
				}
				else if(os.contains("linux")){
					return OSName.LINUX;
				}
			}
	    }catch(SecurityException e){
	    	e.printStackTrace();
	    }
	    return OSName.UNKNOWN;
	}

}
